package com.yc.other.smdemo;

import java.io.IOException;  
import java.math.BigInteger;  

import org.bouncycastle.crypto.AsymmetricCipherKeyPair;  
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;  
import org.bouncycastle.crypto.params.ECPublicKeyParameters;  
import org.bouncycastle.math.ec.ECPoint; 

public class SM2Utils {
//	public static String prik = "0086CCC9188E5369FC063F10CE025AB00AF677FFB3F409F52E1C7567219DEB3200";
//	public static String pubk = "0485A21AD78FAAB8163DB3202496C7BDCD5D66C3F57044B56D5A3FAD905E8E57E6701F8B76FE1CB9ECB9FC9FFB15A8067A2720A1A39902CA879194CDFB228702C2";
//	  //生成随机秘钥对
//    public static void generateKeyPair(){
//        SM2 sm2 = SM2.Instance();
//        AsymmetricCipherKeyPair key = sm2.ecc_key_pair_generator.generateKeyPair();
//        ECPrivateKeyParameters ecpriv = (ECPrivateKeyParameters) key.getPrivate();
//        ECPublicKeyParameters ecpub = (ECPublicKeyParameters) key.getPublic();
//        BigInteger privateKey = ecpriv.getD();
//        ECPoint publicKey = ecpub.getQ();
//
//        System.out.println("公钥: " + Util.byteToHex(publicKey.getEncoded()));
//        System.out.println("私钥: " + Util.byteToHex(privateKey.toByteArray()));
//    }
//
//    //数据加密
//    public static String encrypt(String  publicKeys, String datas) throws IOException
//    {
//    	byte[] publicKey=Util.hexToByte(publicKeys);
//    	byte[] data=datas.getBytes();
//        if (publicKey == null || publicKey.length == 0)
//        {
//            return null;
//        }
//
//        if (data == null || data.length == 0)
//        {
//            return null;
//        }
//
//        byte[] source = new byte[data.length];
//        System.arraycopy(data, 0, source, 0, data.length);
//
//        Cipher cipher = new Cipher();
//        SM2 sm2 = SM2.Instance();
//        ECPoint userKey = sm2.ecc_curve.decodePoint(publicKey);
//
//        ECPoint c1 = cipher.Init_enc(sm2, userKey);
//        cipher.Encrypt(source);
//        byte[] c3 = new byte[32];
//        cipher.Dofinal(c3);
//
////      System.out.println("C1 " + Util.byteToHex(c1.getEncoded()));
////      System.out.println("C2 " + Util.byteToHex(source));
////      System.out.println("C3 " + Util.byteToHex(c3));
//        //C1 C2 C3拼装成加密字串
//        return Util.byteToHex(c1.getEncoded()) + Util.byteToHex(source) + Util.byteToHex(c3);
//
//    }
//
//    //数据解密
//    public static String decrypt(String privateKeys, String datas) throws IOException
//    {
//    	byte[] privateKey=Util.hexToByte(privateKeys);
//    	byte[] encryptedData=Util.hexToByte(datas);
//        if (privateKey == null || privateKey.length == 0)
//        {
//            return null;
//        }
//
//        if (encryptedData == null || encryptedData.length == 0)
//        {
//            return null;
//        }
//        //加密字节数组转换为十六进制的字符串 长度变为encryptedData.length * 2
//        String data = Util.byteToHex(encryptedData);
//        /***分解加密字串
//         * （C1 = C1标志位2位 + C1实体部分128位 = 130）
//         * （C3 = C3实体部分64位  = 64）
//         * （C2 = encryptedData.length * 2 - C1长度  - C2长度）
//         */
//        byte[] c1Bytes = Util.hexToByte(data.substring(0,130));
//        int c2Len = encryptedData.length - 97;
//        byte[] c2 = Util.hexToByte(data.substring(130,130 + 2 * c2Len));
//        byte[] c3 = Util.hexToByte(data.substring(130 + 2 * c2Len,194 + 2 * c2Len));
//
//        SM2 sm2 = SM2.Instance();
//        BigInteger userD = new BigInteger(1, privateKey);
//
//        //通过C1实体字节来生成ECPoint
//        ECPoint c1 = sm2.ecc_curve.decodePoint(c1Bytes);
//        Cipher cipher = new Cipher();
//        cipher.Init_dec(userD, c1);
//        cipher.Decrypt(c2);
//        cipher.Dofinal(c3);
//
//        //返回解密结果
//        return new String(c2);
//    }
//
//    public static void main(String[] args) throws Exception
//    {
//        //生成密钥对
//        generateKeyPair();
//
//        String plainText = "开心";
//
//        //下面的秘钥可以使用generateKeyPair()生成的秘钥内容
//        // 国密规范正式私钥
//        String prik = "0083ACC30702F6E2074DE7D158FE7E7F2B1E87CC5BF12D0A749058AF49AD554A1D";
//        // 国密规范正式公钥
//        String pubk = "044EC787C8F207C8117682ECB8002AAA5618C7172EE0F9C9D3760DD018ED8E1D151E43E1A7DE57CF4B21886D6EA9157EA3B59DA86C6A4E83B7814962E370DEA890";
//
//        System.out.println("加密: ");
//        String cipherText = SM2Utils.encrypt(pubk, plainText);
//        System.out.println(cipherText);
//        System.out.println("解密: ");
//        plainText = SM2Utils.decrypt(prik, cipherText);
//        System.out.println(plainText);
//
//    }
}
